package com.example.oop.Service;

import com.example.oop.POJO.User;
import com.example.oop.Repository.RepositoryManager;
import com.example.oop.Repository.UserRepository;
import com.example.oop.Utils.Response;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.Date;

//方法要互斥调用，repository互斥使用
public class LoginService {
    private final UserRepository userRepository;

    public LoginService() {
        userRepository = RepositoryManager.userRepository;  //从仓库中获取仓库
    }

    //    实现登陆操作
    //要求互斥调用
    public synchronized JSONObject doLogin(JSONObject loginRequest) throws JSONException {
        synchronized (RepositoryManager.userRepository) {  //对全局变量userRepository进行互斥访问！防止两个进程同时访问数据库
            JSONObject response;  //定义用来响应的JSON

            String username = loginRequest.optString("username", "");  //获取用户名
            String password = loginRequest.optString("password", "");  //获取密码

            User user = null;  //根据用户名获取用户信息
            if (userRepository.findByUsername(username).isPresent()) {
                user = userRepository.findByUsername(username).get();  //从数据库中获取用户
            }

            if (username.equals("")) {  //用户名不能为空
                response = Response.getJsonObject("-1", "用户名不能为空！");
            }else if (password.equals("")) {
                response = Response.getJsonObject("-2", "密码不能为空！");
            }else if (user == null) {  //用户是否存在
                response = Response.getJsonObject("-3", "用户名不存在！");
            }else if (!user.getPassword().equals(password)) {  //用户密码是否正确
                response = Response.getJsonObject("-4", "用户名与密码不匹配！");
            } else {  //用户通过验证
                user.setStatus(true);  //设置用户登陆状态
                user.setLoginTime(new Date());  //设置登陆时间
                userRepository.save(user);  //保存当前用户信息
                System.out.println("用户" + username + "与服务器建立连接！");

//            TODO 为用户增加Token对用户的后续操作进行认证
                response = Response.getJsonObject("0", "登陆成功！");

                JSONObject jsonData = new JSONObject();
                jsonData.put("username", username);

                response.put("status", 0);
                response.put("data", jsonData);
            }

            return response;
        }
    }
}
